#include "angle_utils.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>  // 宽字符支持

// 将弧度转为字符串，ext 为小数保留位数
wchar_t* rad2strE(double d, int tim, int ext) {
    static wchar_t s[50];
    wchar_t w1[3], w2[3], w3[3];
    wcscpy(w1, L"°");
    wcscpy(w2, L"'");
    wcscpy(w3, L"\"");
    wchar_t sign = L' ';
    if (d < 0) {
        d = -d;
        sign = L'-';
    }
    if (tim) {
        d *= 12 / PI;
        wcscpy(w1, L"h ");
        wcscpy(w2, L"m");
        wcscpy(w3, L"s");
    } else {
        d *= 180 / PI;
    }
    int a = (int)floor(d);
    d = (d - a) * 60;
    int b = (int)floor(d);
    d = (d - b) * 60;
    int c = (int)floor(d);

    double Q = pow(10, ext);
    d = floor((d - c) * Q + 0.5);
    if (d >= Q) {
        d -= Q;
        c++;
    }
    if (c >= 60) {
        c -= 60;
        b++;
    }
    if (b >= 60) {
        b -= 60;
        a++;
    }

    wchar_t a_str[10], b_str[10], c_str[10], d_str[10];
    swprintf(a_str, sizeof(a_str), L"%3d", a);
    swprintf(b_str, sizeof(b_str), L"%02d", b);
    swprintf(c_str, sizeof(c_str), L"%02d", c);
    swprintf(d_str, sizeof(d_str), L"%0*d", ext, (int)d);

    swprintf(s, sizeof(s), L"%lc%s%s%s%s%s", sign, a_str, w1, b_str, w2, c_str);
    if (ext > 0) {
        wcscat(s, L".");
        wcscat(s, d_str);
        wcscat(s, w3);
    }
    return s;
}

// 将弧度转为字符串，保留 2 位小数
wchar_t* rad2str(double d, int tim) {
    return rad2strE(d, tim, 2);
}

// 将弧度转为字符串，精确到分
wchar_t* rad2str2(double d) {
    static wchar_t s[20];
    wchar_t w1[3], w2[3];
    wcscpy(w1, L"°");
    wcscpy(w2, L"'");
    wchar_t sign = L'+';
    if (d < 0) {
        d = -d;
        sign = L'-';
    }
    d *= 180 / PI;
    int a = (int)floor(d);
    int b = (int)floor((d - a) * 60 + 0.5);
    if (b >= 60) {
        b -= 60;
        a++;
    }
    wchar_t a_str[10], b_str[10];
    swprintf(a_str, sizeof(a_str), L"%3d", a);
    swprintf(b_str, sizeof(b_str), L"%02d", b);
    swprintf(s, sizeof(s), L"%lc%s%s%s%s", sign, a_str, w1, b_str, w2);
    return s;
}

// 秒转为分秒，fx 为小数点位数，fs 为 1 转为 "分秒" 格式，否则转为 "角度分秒" 格式
wchar_t* m2fm(double v, int fx, int fs) {
    static wchar_t s[50];
    wchar_t gn = L'\0';
    if (v < 0) {
        v = -v;
        gn = L'-';
    }
    int f = (int)floor(v / 60);
    double m = v - f * 60;
    if (!fs) {
        swprintf(s, sizeof(s), L"%lc%d'%.*f\"", gn, f, fx, m);
    } else if (fs == 1) {
        swprintf(s, sizeof(s), L"%lc%d分%.*f秒", gn, f, fx, m);
    } else if (fs == 2) {
        swprintf(s, sizeof(s), L"%lc%dm%.*fs", gn, f, fx, m);
    }
    return s;
}

// 字符串转弧度，f=1 表示输入的 s 为时分秒
double str2rad(const wchar_t* s, int f) {
    double fh = 1.0;
    f = f ? 15 : 1;
    if (wcsstr(s, L"-") != NULL) {
        fh = -1.0;
    }
    wchar_t s_copy[100];
    wcscpy(s_copy, s);
    wchar_t* token = wcstok(s_copy, L"hms°\'\" ");
    double values[3] = {0, 0, 0};
    int i = 0;
    while (token != NULL && i < 3) {
        values[i++] = wcstod(token, NULL);
        token = wcstok(NULL, L"hms°\'\" ");
    }
    return fh * (values[0] * 3600 + values[1] * 60 + values[2]) / rad * f;
}